import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 1.	使用逻辑回归，完成鸢尾花多分类操作
# (1)	读入数据集
# ①	读取数据iris.txt（5分）
df = pd.read_csv(r'..\..\..\large_data\ML2\iris.txt')
print(df[:5])

# ②	将x，y进行切分（5分）
x = df.iloc[:, :-1]
y = df.iloc[:, -1]

# (2)	数据预处理
# ①	将特征进行标准化处理（10分）
scaler = StandardScaler()
x = scaler.fit_transform(x)

# ②	y值进行标签化处理（10分）
enc = LabelEncoder()
y = enc.fit_transform(y)

# ③	使用留出法切分数据，比例为7:3（10分）
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=666)

# (3)	模型创建、处理及评估
# ①	创建逻辑回归模型（10分）
fixed_params = dict(solver='liblinear',
                    max_iter=1000,
                    multi_class='auto',
                    )
estimator = LogisticRegression(**fixed_params)

# ②	使用网格交叉验证，分别设置c值为1, 10, 20, 50（10分）
grid = GridSearchCV(estimator,
                    dict(C=[1, 10, 20, 50]),
                    cv=5,
                    iid=True)

# ③	拟合数据（10分）
grid.fit(x_train, y_train)
model = LogisticRegression(**fixed_params,
                           **(grid.best_params_))
model.fit(x_train, y_train)

# ④	打印模型得分（10分）
print(f'最优得分: {grid.best_score_}')
print(f'训练集模型得分: {model.score(x_train, y_train)}')
print(f'测试集模型得分: {model.score(x_test, y_test)}')

# ⑤	打印模型最优参数（10分）
print(f'最优参数: {grid.best_params_}')

# ⑥	打印模型准确率（10分）
h_test = model.predict(x_test)
print(f'模型准确率: {accuracy_score(y_test, h_test)}')
